From d1d654ebac2d51e3841675faeb56480e440f622f Mon Sep 17 00:00:00 2001
From: Wolfgang Müller
Date: Tue, 5 Mar 2024 18:08:09 +0100
Subject: Initial commit

---
 frontend/src/routes/archives/[id]/+page.svelte | 99 ++++++++++++++++++++++++++
 1 file changed, 99 insertions(+)
 create mode 100644 frontend/src/routes/archives/[id]/+page.svelte

(limited to 'frontend/src/routes/archives/[id]/+page.svelte')

diff --git a/frontend/src/routes/archives/[id]/+page.svelte b/frontend/src/routes/archives/[id]/+page.svelte
new file mode 100644
index 0000000..50a2940
--- /dev/null
+++ b/frontend/src/routes/archives/[id]/+page.svelte
@@ -0,0 +1,99 @@
+<script lang="ts">
+	import { updateArchives } from '$gql/Mutations';
+	import { archiveQuery } from '$gql/Queries';
+	import { Direction, Layout, type FullArchiveFragment, type PageFragment } from '$gql/graphql';
+	import { initReaderContext } from '$lib/Reader';
+	import { initSelectionContext } from '$lib/Selection';
+	import { setTabContext } from '$lib/Tabs';
+	import { toastFinally } from '$lib/Toasts';
+	import Guard from '$lib/components/Guard.svelte';
+	import Head from '$lib/components/Head.svelte';
+	import Titlebar from '$lib/components/Titlebar.svelte';
+	import Grid from '$lib/containers/Grid.svelte';
+	import Gallery from '$lib/gallery/Gallery.svelte';
+	import PageView from '$lib/reader/PageView.svelte';
+	import Reader from '$lib/reader/Reader.svelte';
+	import ArchiveDelete from '$lib/tabs/ArchiveDelete.svelte';
+	import ArchiveDetails from '$lib/tabs/ArchiveDetails.svelte';
+	import ArchiveEdit from '$lib/tabs/ArchiveEdit.svelte';
+	import Tab from '$lib/tabs/Tab.svelte';
+	import Tabs from '$lib/tabs/Tabs.svelte';
+	import { getContextClient } from '@urql/svelte';
+	import type { PageData } from './$types';
+
+	export let data: PageData;
+	const client = getContextClient();
+	const reader = initReaderContext();
+	setTabContext({
+		tabs: {
+			details: { title: 'Details' },
+			edit: { title: 'Edit' },
+			deletion: { title: 'Delete' }
+		},
+		current: 'details'
+	});
+
+	$: result = archiveQuery(client, { id: data.id });
+
+	function updateCover(event: CustomEvent<number>) {
+		updateArchives(client, { ids: archive.id, input: { cover: { id: event.detail } } }).catch(
+			toastFinally
+		);
+	}
+
+	let archive: FullArchiveFragment;
+
+	$: $result, update();
+	function update() {
+		if (!$result.stale && $result.data?.archive.__typename === 'FullArchive') {
+			archive = structuredClone($result.data.archive);
+
+			$reader.pages = archive.pages;
+		}
+	}
+
+	const selection = initSelectionContext<PageFragment>('Page', (p) => p.path);
+	$selection.selectable = (p) => p.comicId === null;
+
+	$: if (archive) {
+		$selection.view = archive.pages;
+	}
+</script>
+
+<Head section="Archive" title={archive?.name} />
+
+{#if archive}
+	<Grid>
+		<header>
+			<Titlebar title={archive.name} />
+		</header>
+
+		<aside>
+			<Tabs>
+				<Tab id="details">
+					<ArchiveDetails {archive} />
+				</Tab>
+				<Tab id="edit">
+					<ArchiveEdit {archive} />
+				</Tab>
+				<Tab id="deletion">
+					<ArchiveDelete {archive} />
+				</Tab>
+			</Tabs>
+		</aside>
+
+		<main class="overflow-auto">
+			<Gallery
+				pages={archive.pages}
+				on:open={(e) => ($reader = $reader.open(e.detail))}
+				on:cover={updateCover}
+			/>
+		</main>
+	</Grid>
+{:else}
+	<Guard {result} />
+{/if}
+
+<Reader>
+	<PageView layout={Layout.Single} direction={Direction.LeftToRight} />
+</Reader>
-- 
cgit v1.2.3-2-gb3c3

